package bd;

import java.sql.*;

/** Classe pFun, encarregada da criação do painel de funcionarios
 *
 */
public class pFun extends javax.swing.JPanel {

    private String condicoes;
    private conecta bd;
    private frame principal;
    private ResultSet retorno;
    private boolean atualizacao;
    private String novaLinha;
    private painelTabelas painel;

    /** construtor da classe pFun, encarregado de dar forma ao painel,
     * fazer a ligação com o banco de dados e com a janela principal
     */
    public pFun(conecta bd, frame principal, painelTabelas painel) {
        initComponents();
        this.bd = bd;
        this.principal = principal;
        this.cancelaFunc.setVisible(false);
        this.painel = painel;
    }

    /** Método initComponents(). tem a função da criação da janela de funcionarios,
     * criando botões, caixas de texto, etc. É o método que dá forma à janela.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buscaFunc = new javax.swing.JButton();
        insereFunc = new javax.swing.JButton();
        atualizaFunc = new javax.swing.JButton();
        removeFunc = new javax.swing.JButton();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        cpfFuFUNC = new javax.swing.JTextField();
        nomeCoFUNC = new javax.swing.JTextField();
        idFuFUNC = new javax.swing.JTextField();
        cancelaFunc = new javax.swing.JButton();
        jLabel15 = new javax.swing.JLabel();
        jLabel16 = new javax.swing.JLabel();
        dataNascFUNC = new javax.swing.JTextField();
        idTipoFuFUNC = new javax.swing.JTextField();

        buscaFunc.setText("Buscar");
        buscaFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscaFuncActionPerformed(evt);
            }
        });

        insereFunc.setText("Inserir");
        insereFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                insereFuncActionPerformed(evt);
            }
        });

        atualizaFunc.setText("Atualizar");
        atualizaFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                atualizaFuncActionPerformed(evt);
            }
        });

        removeFunc.setText("Remover");
        removeFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                removeFuncActionPerformed(evt);
            }
        });

        jLabel7.setText("ID do Funcionário:");

        jLabel8.setText("Nome Completo:");

        jLabel9.setText("CPF do Funcionário:");

        jLabel10.setText("ID do Tipo de Funcionário:");

        cancelaFunc.setText("Cancelar");
        cancelaFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelaFuncActionPerformed(evt);
            }
        });

        jLabel15.setText("Entre com os dados:");

        jLabel16.setText("Data de Nascimento:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 489, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(48, 48, 48)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(buscaFunc)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(insereFunc)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(atualizaFunc)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(removeFunc)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(cancelaFunc))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(jLabel15, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)
                                .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(jLabel10)
                                        .addComponent(jLabel9)
                                        .addComponent(jLabel7)
                                        .addComponent(jLabel8)
                                        .addComponent(jLabel16))
                                    .addGap(18, 18, 18)
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(idTipoFuFUNC, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)
                                        .addComponent(dataNascFUNC, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)
                                        .addComponent(idFuFUNC, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)
                                        .addComponent(nomeCoFUNC, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)
                                        .addComponent(cpfFuFUNC, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE))))
                            .addGap(76, 76, 76)))
                    .addGap(48, 48, 48)))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 317, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jLabel15)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel7)
                        .addComponent(idFuFUNC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel8)
                        .addComponent(nomeCoFUNC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(12, 12, 12)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel9)
                        .addComponent(cpfFuFUNC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel10)
                        .addComponent(idTipoFuFUNC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(17, 17, 17)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel16)
                        .addComponent(dataNascFUNC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 111, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(buscaFunc)
                        .addComponent(insereFunc)
                        .addComponent(atualizaFunc)
                        .addComponent(removeFunc)
                        .addComponent(cancelaFunc))
                    .addContainerGap()))
        );
    }// </editor-fold>//GEN-END:initComponents

    /** Trata eventos relacionados ao botão buscar.
     * Realiza a busca de acordo com determinado texto digitado, retornando
     * o resultado da pesquisa. Também trata erro.
     */
    private void buscaFuncActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscaFuncActionPerformed
        lerFunc();
        try {
            System.out.println(condicoes);
            retorno = bd.consulta("SELECT * FROM funcionario " + condicoes);
            this.principal.mostraBusca(retorno);
        } catch (SQLException ex) {
            bd.trataErro(ex);
        }
        limpaTela();    }//GEN-LAST:event_buscaFuncActionPerformed

    /** Trata eventos relacionados ao botão atualiza. Quando o botão é pressionado,
     * é enviada uma mensagem de instruções para acontecer a atualização.
     * Recebe os dados digitados e atualiza no banco.
     */
    private void atualizaFuncActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_atualizaFuncActionPerformed
        if (atualizacao == false) {
            lerFunc();
            jLabel15.setText("Entre com os novos dados e aperte atualizar novamente");
            mudaVisualizacaoFunc();
            limpaTela();
        } else if (atualizacao == true) {
            novaLinha = "SET";
            if (idFuFUNC.getText() != null && !idFuFUNC.getText().trim().equals("")) {
                novaLinha = novaLinha + " idFu = " + idFuFUNC.getText() + ", ";
            }
            if (nomeCoFUNC.getText() != null && !nomeCoFUNC.getText().trim().equals("")) {
                novaLinha = novaLinha + " nomeCompletoFu = UPPER('" + nomeCoFUNC.getText() + "'), ";
            }
            if (cpfFuFUNC.getText() != null && !cpfFuFUNC.getText().trim().equals("")) {
                novaLinha = novaLinha + " cpfFu = " + cpfFuFUNC.getText() + ", ";
            }
            if (idTipoFuFUNC.getText() != null && !idTipoFuFUNC.getText().trim().equals("")) {
                novaLinha = novaLinha + " idTipoFu = " + idTipoFuFUNC.getText() + ", ";
            }
            if (dataNascFUNC.getText() != null && !dataNascFUNC.getText().trim().equals("")) {
                novaLinha = novaLinha + " dataNascimentoFu = TO_DATE('" + dataNascFUNC.getText() + "', 'DD.MM.YYYY'), ";
            }
            novaLinha = novaLinha.substring(0, novaLinha.length() - 2);
            System.out.println("UPDATE funcionario " + novaLinha + " " + condicoes);
            bd.atualiza("UPDATE funcionario " + novaLinha + " " + condicoes);
            jLabel15.setText("Entre com os dados:");
            mudaVisualizacaoFunc();
            condicoes = null;
            novaLinha = null;
            limpaTela();
        }
    }//GEN-LAST:event_atualizaFuncActionPerformed

    /** Trata eventos relacionados ao botão remove.
     * Remove determinada tupla selecionada. trata erros
     */
    private void removeFuncActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeFuncActionPerformed
        novaLinha = "funcionario";//novaLinha esta sendo usada para parametrizar a exclusão pelo outro painel
        lerFunc();
        try {
            retorno = bd.consulta("SELECT * FROM " + novaLinha + " " + condicoes);
            this.painel.novaLinha = novaLinha;
            this.painel.condicoes = condicoes;
        } catch (SQLException ex) {
            System.out.println("Erro: " + ex);
        }
        this.principal.BuscaParaRemover(retorno);
        limpaTela();
    }//GEN-LAST:event_removeFuncActionPerformed

    /** Trata eventos relacionados ao botão insere.
     * Faz a inserção no banco de dados dos valores digitados no painel.
     */
    private void insereFuncActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_insereFuncActionPerformed
        bd.insercao("INSERT INTO funcionario(idFu, nomeCompletoFu, dataNascimentoFu, cpfFu, salarioFu, idTipoFu)"
                + "VALUES (ID_FU.NEXTVAL, "
                + "UPPER('" + nomeCoFUNC.getText() + "'), "
                + "TO_DATE('" + dataNascFUNC.getText() + "', 'DD.MM.YYYY'), "
                + cpfFuFUNC.getText()
                + ", 0, "
                + idTipoFuFUNC.getText() + " )");
        limpaTela();
    }//GEN-LAST:event_insereFuncActionPerformed

    /** Trata eventos relacionados ao botão cancelar.
     * Ajusta o label da janela, volta pra janela principal e limpa os campos
     */
    private void cancelaFuncActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelaFuncActionPerformed
        jLabel15.setText("Entre com os dados:");
        mudaVisualizacaoFunc();
        condicoes = null;
        novaLinha = null;
        limpaTela();
    }//GEN-LAST:event_cancelaFuncActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton atualizaFunc;
    private javax.swing.JButton buscaFunc;
    private javax.swing.JButton cancelaFunc;
    private javax.swing.JTextField cpfFuFUNC;
    private javax.swing.JTextField dataNascFUNC;
    private javax.swing.JTextField idFuFUNC;
    private javax.swing.JTextField idTipoFuFUNC;
    private javax.swing.JButton insereFunc;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JTextField nomeCoFUNC;
    private javax.swing.JButton removeFunc;
    // End of variables declaration//GEN-END:variables

    /** Lê valores digitados, usando-os para fazer a condição do select
     */
    private void lerFunc() {
        condicoes = "WHERE";
        if (idFuFUNC.getText() != null && !idFuFUNC.getText().trim().equals("")) {
            condicoes = condicoes + " idFu = " + idFuFUNC.getText() + " AND ";
        }
        if (nomeCoFUNC.getText() != null && !nomeCoFUNC.getText().trim().equals("")) {
            condicoes = condicoes + " UPPER(nomeCompletoFu) LIKE UPPER('%" + nomeCoFUNC.getText() + "%') AND ";
        }
        if (cpfFuFUNC.getText() != null && !cpfFuFUNC.getText().trim().equals("")) {
            condicoes = condicoes + " cpfFu = " + cpfFuFUNC.getText() + " AND ";
        }
        if (idTipoFuFUNC.getText() != null && !idTipoFuFUNC.getText().trim().equals("")) {
            condicoes = condicoes + " idTipoFu = " + idTipoFuFUNC.getText() + " AND ";
        }
        if (dataNascFUNC.getText() != null && !dataNascFUNC.getText().trim().equals("")) {
            condicoes = condicoes + " dataNascimentoFu = TO_DATE('" + dataNascFUNC.getText() + "', 'DD.MM.YYYY') AND ";
        }
        condicoes = condicoes.substring(0, condicoes.length() - 5);
    }

    /** limpa os campos.
     */
    private void limpaTela() {
        cpfFuFUNC.setText(null);
        dataNascFUNC.setText(null);
        idFuFUNC.setText(null);
        idTipoFuFUNC.setText(null);
        nomeCoFUNC.setText(null);
    }

    /** Método que muda a visualização da janela de funcionarios
     */
    private void mudaVisualizacaoFunc() {
        cancelaFunc.setVisible(!atualizacao);
        painel.abaEdicaoTabelas.setEnabled(atualizacao);
        painel.painelPrincipal.setEnabled(atualizacao);
        buscaFunc.setEnabled(atualizacao);
        insereFunc.setEnabled(atualizacao);
        removeFunc.setEnabled(atualizacao);
        atualizacao = !atualizacao;
    }
}
